# @Time : 2020/8/27 10:33
# @Author : Fioman 
# @Phone : 13149920693
"""
均值滤波,卷积求和然后求平均数
cv.blur(src,kernel)
"""
import cv2 as cv
import numpy as np

image = cv.imread("pic/03.png")
cv.imshow("Original", image)
kernelSizes = [(3, 3), (9, 9), (15, 15)]
for kernelSize in kernelSizes:
    blurred = cv.blur(image, kernelSize)
    cv.imshow("Average ({},{})".format(kernelSize[0], kernelSize[1]), blurred)
    cv.waitKey(0)


"""
高斯模糊:
高斯模糊和均值模糊有点相似,但是我们不再使用简单的平均值,而是使用加权平均值.它用来处理那些比较符合高斯噪声的图像.
高斯模糊主要使用到了空间阈,没有使用颜色阈.
越是靠近所处理像素点的位置对结果影响越大,越是远离的地方,影响越小
高斯模糊的核M*N,都必须是奇数
它的好处就是比简单的平均平滑处理更好地保留了图像中的边缘.
"""
image = cv.imread("pic/03.png")
cv.imshow("Original",image)
for kernelSize in kernelSizes:
    blurred = cv.GaussianBlur(image,kernelSize,0)
    cv.imshow("Gaussian ({},{})".format(kernelSize[0],kernelSize[1]),blurred)
    cv.waitKey(0)


"""
中值模糊,就是求核大小范围内的一个中间值作为新的值赋值给要处理的图像
中值模糊用来消除椒盐噪声最为有效.
中值模糊一定是一个正方形内核,所以我们一般只指定核大小即可.是将中心像素替换为邻域的中值.
中值模糊能够消除图像中的椒盐噪声更有效的原因是,每个中心像素始终被替换为图像中存在的像素强度.而且由于中位数对异常值具有.
但是中值模糊有一个缺点,就是会去除掉更多的细节和噪点.
"""
for kernel in (3,9,15):
    blurred = cv.medianBlur(image,kernel)
    cv.imshow("Median {}".format(kernel),blurred)
    cv.waitKey(0)

"""
双边滤波,双边模糊
以上所有的模糊方法都可以去除噪声和细节,但是也有缺点.就是会丢失图像的边缘信息.
为了在保持边缘不变的同时减少噪声,我们可以使用双边模糊.双边模糊引入了两个高斯分布来实现.
第一个高斯函数仅考虑空间邻域.第一个只针对空间,也就是仅仅影响靠近中心像素范围的邻域.
第二个高斯函数仅考虑像素强度邻域,也就是说仅仅包括具有相似强度的像素.
如果像素差很大,就认为是边缘.就不会去过滤.
吃方法的优点就是可以保留边缘,但是缺点就是,它比均值模糊,高斯模糊,中值模糊要慢的多.
并且核越大,空间域参数和像素强度阈参数越大,越慢.所以我们一般使用一个小的空间域和亮度强度阈进行多次滤波处理.来节省时间
达到同样的效果.
参数sigmaColor越大,表示更多的颜色将会被用到作为双边滤波的结果.
参数sigmaSpace越大,表示更多的空间的值将会被用到作为双边滤波的结果.
"""
params = [(11,21,7),(11,41,21),(11,61,39)]
for diameter,sigmaColor,sigmaSpace in params:
    blurred = cv.bilateralFilter(image,diameter,sigmaColor,sigmaSpace)
    title = "Blurred d = {},sc = {}, ss = {}".format(diameter,sigmaColor,sigmaSpace)
    cv.imshow(title,blurred)
    cv.waitKey(0)















